const request = require('request')
const wxpayUtil = require('./wx.util')
const wxpayData = require('./wxpay.data')
const ip = require('ip')
const log = console.log.bind(console)

var config = {
    appid: 'wxd930ea5d5a258f4f',
	mch_id:	10000100,
	device_info: 1000,
	body: 'test',
	nonce_str: 'ibuaiVcKdpRxkhJA'
}

let sign = wxpayUtil.makeSign(config)
config['sign'] = sign
let xml = wxpayUtil.jsonToXml(config)
log(xml)

log(parseInt(new Date().getTime() / 1000, 10))

log(encodeURIComponent('http://sorry510.cn/wx/oauth2?redirect=/wx/jssdk'))
 // superagent （解决中文问题）
// log(ip.address())
// log(Math.random())
// log(wxUtil.getNonceStr())
// request
// 	.get('https://www.baidu.com')
// 	.on('response', res=> {
// 	    log(res) // 200
// 	})
// 	.on('error', err=> {
// 		log(err)
// 	})

class JsApi {
	/**
	 * 
	 * 统一下单，unifiedOrder中out_trade_no、body、total_fee、trade_type必填
	 * appid、mchid、spbill_create_ip、nonce_str不需要填入
	 * @param 基本配置对象 config 
	 * @param WxPayData对象 order 
	 * @param int timeOut
	 * @throws erro
	 * @return 成功时返回，其他抛异常
	 */
	unifiedOrder(config, order, timeOut = 6) {
		const url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
		//检测必填参数
		if(!order.isSetOut_trade_no()) {
			throw new Error("缺少统一支付接口必填参数out_trade_no！")
		}else if(!order.isSetBody()){
			throw new Error("缺少统一支付接口必填参数body！")
		}else if(!order.isSetTotal_fee()) {
			throw new Error("缺少统一支付接口必填参数total_fee！")
		}else if(!order.isSetTrade_type()) {
			throw new Error("缺少统一支付接口必填参数trade_type！")
		}
		
		//关联参数
		if(order.getTrade_type() == "JSAPI" && !order.isSetOpenid()){
			throw new Error("统一支付接口中，缺少必填参数openid！trade_type为JSAPI时，openid为必填参数！")
		}
		if(order.getTrade_type() == "NATIVE" && !order.isSetProduct_id()){
			throw new Error("统一支付接口中，缺少必填参数product_id！trade_type为JSAPI时，product_id为必填参数！")
		}
		
		//异步通知url未设置，则使用配置文件中的url
		if(!order.isSetNotify_url() && order.getNotifyUrl() != ""){
			order.setNotify_url(config['notifyUrl'])//异步通知url
		}
		
		order.SetAppid(config['appid']); //公众账号ID
		order.SetMch_id(config['mch_id']); //商户号
		order.SetSpbill_create_ip(ip.address()) //终端ip	   	    
		order.SetNonce_str(wxpayUtil.getNonceStr()) //随机字符串
		
		// 签名
		let sign = wxpayUtil.makeSign(order.getConfig())
		order.SetSign(sign);

		// 转化为xml
		let xml = wxpayUtil.jsonToXml(order.getConfig())
		
		// $startTimeStamp = self::getMillisecond();//请求开始时间
		// $response = self::postXmlCurl($config, $xml, $url, false, $timeOut);
		// $result = WxPayResults::Init($config, $response);
		// self::reportCostTime($config, $url, $startTimeStamp, $result);//上报请求花费时间
		
		// return $result;
	}

	/**
	 * 
	 * 获取jsapi支付的参数
	 * @param array $UnifiedOrderResult 统一支付接口返回的数据
	 * @throws WxPayException
	 * 
	 * @return json数据，可直接填入js函数作为参数
	 */
	// getJsApiParameters($UnifiedOrderResult)
	// {
	// 	if(!array_key_exists("appid", $UnifiedOrderResult)
	// 	|| !array_key_exists("prepay_id", $UnifiedOrderResult)
	// 	|| $UnifiedOrderResult['prepay_id'] == "")
	// 	{
	// 		throw new WxPayException("参数错误");
	// 	}

	// 	$jsapi = new WxPayJsApiPay();
	// 	$jsapi->SetAppid($UnifiedOrderResult["appid"]);
	// 	$timeStamp = time();
	// 	$jsapi->SetTimeStamp("$timeStamp");
	// 	$jsapi->SetNonceStr(WxPayApi::getNonceStr());
	// 	$jsapi->SetPackage("prepay_id=" . $UnifiedOrderResult['prepay_id']);

	// 	$config = new WxPayConfig();
	// 	$jsapi->SetPaySign($jsapi->MakeSign($config));
	// 	$parameters = json_encode($jsapi->GetValues());
	// 	return $parameters;
	// }

	/**
	 * 
	 * 通过跳转获取用户的openid，跳转流程如下：
	 * 1、设置自己需要调回的url及其其他参数，跳转到微信服务器https://open.weixin.qq.com/connect/oauth2/authorize
	 * 2、微信服务处理完成之后会跳转回用户redirect_uri地址，此时会带上一些参数，如：code
	 * 
	 * @return 用户的openid
	 */
	// getOpenid()
	// {
	// 	//通过code获得openid
	// 	if (!isset($_GET['code'])){
	// 		//触发微信返回code码
	// 		$baseUrl = urlencode('http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'].$_SERVER['QUERY_STRING']);
	// 		$url = $this->_CreateOauthUrlForCode($baseUrl);
	// 		Header("Location: $url");
	// 		exit();
	// 	} else {
	// 		//获取code码，以获取openid
	// 	    $code = $_GET['code'];
	// 		$openid = $this->getOpenidFromMp($code);
	// 		return $openid;
	// 	}
	// }
}


